﻿#region Using

using SAPbouiCOM;
using SapFramework.Interface.Controls.Items.Base;
using SapFramework.Interface.Events;

using Form = SapFramework.Interface.Controls.Forms.Base.Form;
using Item = SapFramework.Interface.Controls.Items.Base.Item;

#endregion

namespace SapFramework.Interface.Controls.Items.Specific
{
    /// <summary>
    /// Realiza o encapsulamento de um objeto do tipo <see cref="SAPbouiCOM.OptionBtn"/> da UI API do SAP Business One
    /// </summary>
    public sealed class OptionButton : Item, SAPbouiCOM.OptionBtn
    {
        #region Eventos

        /// <summary>
        /// Evento disparado quando o botão principal do mouse foi clicado duas vezes sobre um item, mas nenhuma ação foi tomada ainda.
        /// </summary>
        [Event( BoEventTypes.et_DOUBLE_CLICK )]
        public event EventBoolItem OnBeforeDoubleClick;

        /// <summary>
        /// Evento disparado quando o botão principal do mouse foi clicado duas vezes sobre um item, e qualquer ação do SBO já foi realizada.
        /// </summary>
        [Event( BoEventTypes.et_DOUBLE_CLICK )]
        public event EventVoidItem OnAfterDoubleClick;

        /// <summary>
        /// Evento disparado quando o botão do mouse foi liberado em cima de um item, ou seja, quando o botão do mouse está em cima, mas nenhuma ação foi tomada ainda.
        /// </summary>
        [Event( BoEventTypes.et_ITEM_PRESSED )]
        public event EventBoolItem OnBeforeItemPressed;

        /// <summary>
        /// Evento disparado quando o botão do mouse foi liberado em cima de um item, ou seja, quando o botão do mouse está em cima, e qualquer ação do SBO já foi realizada.
        /// </summary>
        [Event( BoEventTypes.et_ITEM_PRESSED )]
        public event EventVoidItem OnAfterItemPressed;

        #endregion

        /// <summary>
        /// Guarda uma referencia para a parte específica do item
        /// </summary>
        private readonly SAPbouiCOM.OptionBtn mOptionBtn;

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="aForm">O formulário ao qual o item pertence</param>
        /// <param name="aItemUniqueId">Id único do Item do Form do SAP Business One</param>
        public OptionButton( Form aForm, string aItemUniqueId ) : base( aForm, aItemUniqueId, BoFormItemTypes.it_OPTION_BUTTON )
        {
            mOptionBtn = mItem.Specific as SAPbouiCOM.OptionBtn;
        }

        #region Implementation of IOptionBtn

        /// <summary>
        /// Agrupa o botão de opção com outro botão, préviamente inserido.
        /// 
        /// Utilize este método após adicionar um novo botão de opção no formulário, que permitirá que no formulário apenas um botão de opção esteja marcado por vez.
        /// </summary>
        /// <remarks>
        /// Quando invocando este método, o SAP Business One automáticamente gera valores em ordem incremental para a propriedade <see cref="ValOn"/> dos itens, começando de 1.
        /// </remarks>
        /// <param name="aTargetUniqueId">Id único de outro botão de opção</param>
        public void GroupWith( string aTargetUniqueId )
        {
            mOptionBtn.GroupWith( aTargetUniqueId );
        }

        /// <summary>
        /// Indica quando o botão está selecionado
        /// </summary>
        public bool Selected
        {
            get { return mOptionBtn.Selected; }
            set { mOptionBtn.Selected = value; }
        }

        /// <summary>
        /// Referência para o objeto <see cref="DataBind"/>, que realiza uma ligação com um:
        /// <list type="bullet">
        /// <see cref="UserDataSource"/>
        /// <see cref="DBDataSource"/>
        /// <see cref="DataTable"/>
        /// </list>
        /// </summary>
        /// <see cref="DataBind"/>
        public DataBind DataBind
        {
            get { return mOptionBtn.DataBind; }
        }

        /// <summary>
        /// Texto do botão
        /// </summary>
        public string Caption
        {
            get { return mOptionBtn.Caption; }
            set { mOptionBtn.Caption = value; }
        }

        /// <summary>
        /// O valor do data source quando o item está selecionado.
        /// 
        /// Setar o data source com este valor irá seleciona o botão de opção. 
        /// Se o botão de opção for selecionada pelo usuário, o data source é setado para este valor.
        /// </summary>
        /// <remarks>
        /// Esta propriedade só pode ser setada em objetos do usuário.
        /// 
        /// Quando invocando o método <see cref="OptionButton.GroupWith"/> para <see cref="Folder"/> e <see cref="OptionButton"/>, SAP Business One irá automáticamente setar a propriedade ValOn 
        /// destes itens em ordem incremental, partindo do número 1.
        /// </remarks>
        public string ValOn
        {
            get { return mOptionBtn.ValOn; }
            set { mOptionBtn.ValOn = value; }
        }

        /// <summary>
        /// O valor do data source quando o item não está selecionado.
        /// 
        /// Setar o data source com este valor irá des-seleciona o botão de opção. 
        /// Se o botão de opção for des-selecionada pelo usuário, o data source é setado para este valor.
        /// </summary>
        /// <remarks>
        /// Esta propriedade só pode ser setada em objetos do usuário.
        /// </remarks>
        public string ValOff
        {
            get { return mOptionBtn.ValOff; }
            set { mOptionBtn.ValOff = value; }
        }

        #endregion
    }
}